#include "CheckCollision.h"


void leo::CheckCollision::Start(int _ListCount)
{
	list = new vector<Entity*>[_ListCount];

	listCount = _ListCount;

}

void leo::CheckCollision::Stop()
{
	delete []list;
	list = NULL;
}

void leo::CheckCollision::Clear()
{
	for(int i = 0; i<listCount; i++)
	{
		list[i].clear();
	}

}

void leo::CheckCollision::Register(Entity* _entity, int _listNum)
{
	list[_listNum].push_back(_entity);
	//chequear que no existe el mismo entity ya metido!!!
}

void leo::CheckCollision::UnRegister(Entity* _entity, int _listNum)
{
	//creo un iterador para poder recorrer la lista y buscar lo que quiero 
	//borrar
	vector<Entity*>::iterator it = list[_listNum].begin();

	while (it != list[_listNum].end())
	{
		if ((*it) == _entity)
		{
			list[_listNum].erase(it);
			return;
		}
		it++;
	}
}

void leo::CheckCollision::Check(int _type)
{

	float px, py;

	//_listCount-1 xq la ultima lista no va a chequear con nadie
	for(int i = 0; i<listCount-1; i++)
	{
		//arranca en i+1 para cheuqear con la lista que le sigue
		for(int j = i+1; j<listCount; j++)
		{
			//chequea cada elem de la lista 
			for(int id1 = 0; id1<list[i].size(); id1++)
			{
				Entity *e1 = list[i][id1];

				for(int id2 = 0; id2<list[j].size(); id2++)
				{
					Entity *e2 = list[j][id2];

					if (CheckBoundingBox(e1, e2, px, py))
							{
								e1->OnCollide(*e2, px, py);
								e2->OnCollide(*e1, px, py);
							}
												
					
				}
			}
		}
	}
}

//px py referencias para modificar las variables en si
bool leo::CheckCollision::CheckBoundingBox(Entity* _ent1, Entity* _ent2, float &_px, float &_py)
{
	float dx = abs((_ent1->GetPosX() + _ent1->GetWidth() / 2) - (_ent2->GetPosX() + _ent2->GetWidth() / 2));
	float dy = abs((_ent1->GetPosY() + _ent1->GetHeight() / 2) - (_ent2->GetPosY() + _ent2->GetHeight() / 2));
	
	float w1 = _ent1->GetWidth();
	float w2 = _ent2->GetWidth(); 

	
	float h1 = _ent1->GetHeight();
	float h2 = _ent2->GetHeight();


	if (abs(dx)< w1/2 + w2/2 && abs(dy) < h1/2 + h2/2)
	{
		_px = (w1 + w2)/2 - abs(dx);
		_py = (h1 + h2)/2 - abs(dy);
		return true;
	}
	
	return false;

}

